PHP Filter
php://read=読み込み時に使われるフィルタ/write=書き込み時に使われるフィルタ/どちらにも使われるフィルタ/resource=pathが基本
フィルタは|区切りで複数適用できる。read/writeフィルタはオプション
Filterを用いて様々な文字列処理が可能
convert.base64-encode
convert.iconv.*
iconvによる変換ができる
string.strip_tags
PHP8未満で使える
Filterを利用して任意の文字列を含む文字列を生成できる黒魔術テクニックがある
convert.iconv.UTF8.CSISO2022KRを適用すると常に先頭に\x1b$)Cが生成されることを利用する
iconvで頑張って好きなbase64文字列を生成し、convert.base64-decodeに変換して任意の1文字を生成する
途中ごみが入ったりエラーになったりしないよう色々やる
これを頑張って繰り返すと上手いこと任意の文字列を生成できる...という原理
ただし、文字列の末尾にごみが入ってしまう問題がある
PHP8未満であればstring.strip_tagsを利用して末尾に<を入れることで消せる
エラーが起きたかどうかを判別できる場合、任意のファイルの内容を1文字ずつ漏洩させることができる
DownUnderCTF 2022 - minimal-phpで発表された手法
PHPが扱えるファイルサイズの上限を超えるとエラーが起きる挙動と、dechunk filterを組み合わせてオラクルを構築する